use std::{error::Error, fs::File, io, path::Path, sync::{LazyLock, OnceLock}};

use walkdir::WalkDir;
use zip::{write::FileOptions, ZipWriter};

fn zip_folder(
    src_dir: &Path,
    dst_file: &Path,
) -> io::Result<()> {
    // 创建目标 ZIP 文件
    let file = File::create(dst_file)?;
    let mut zip = ZipWriter::new(file);

    // 设置 ZIP 文件选项
    let options: FileOptions<'_, ()> = FileOptions::default()
        .compression_method(zip::CompressionMethod::Deflated)
        .unix_permissions(0o755);

    // 遍历文件夹
    let walkdir = WalkDir::new(src_dir);
    for entry in walkdir.into_iter().filter_map(|e| e.ok()) {
        let path = entry.path();
        let relative_path = path.strip_prefix(src_dir)
            .map_err(|e|io::Error::new(io::ErrorKind::Other,
                 e))?
            .to_path_buf();

        // 将路径转换为 ZIP 兼容的格式（使用斜杠 `/` 作为分隔符）
        let name = relative_path.to_str().unwrap().replace("\\", "/");
        println!("name:{}",name);
        // 跳过根目录
        if name.is_empty() {
            continue;
        }

        // 如果是文件夹，添加目录条目
        if path.is_dir() {
            zip.add_directory(&name, options)?;
        } else {
            // 如果是文件，添加文件条目
            zip.start_file(&name, options)?;
            let mut f = File::open(path)?;
            io::copy(&mut f, &mut zip)?;
        }
    }

    // 完成 ZIP 文件写入
    zip.finish()?;
    Ok(())
}
#[test]
pub fn test_zip()->io::Result<()>{
    let src_dir = Path::new("D:\\Kitchen\\Repository\\hello-axum/upload"); // 要压缩的文件夹路径
    let dst_file = Path::new("output.zip"); // 输出的 ZIP 文件路径

    zip_folder(src_dir, dst_file)?;
    println!("ZIP file created successfully!");
    Ok(())
}